Unity WebGL内存详解
自Unity加入WebGL平台支持以来,Unity开发团队就一直致力于优化WebGL的内存消耗。在Unity使用手册上已有对于WebGL内存管理的详尽分析,Unite Europe 2015与Unite Boston 2015两届大会上,也有专题对WebGL进行深入的讲解。然而,这方面的内容依旧是用户讨论的热门话题,因此我们意识到应当分享更多。
本文将回答一些被频繁咨询的问题。如果想深入了解WebGL,请点击[阅读原文]可以更多关于WebGL平台的Unity堆,源代码/编译代码内存,资源数据,内存文件系统,Asset Bundles,Asset Bundle缓存,Asset Bundle压缩,网页音频相关的详细解析报告。
在内存方面,主机平台相对其它平台较为简单,因为可以准确知道内存是如何使用的。这允许您可以很好的管理内存,并保证游戏内容完美运行。在移动平台,内存管理变的有些复杂,因为设备种类繁多,但至少可以选择最低标准的设备,并根据市场情况忽视那些相较于该标准更为的低端设备。
在网页平台,就没有那么轻松了。理想情况下,所有终端用户都拥有64位浏览器和大量内存,但事实却相距甚远。首先,您无法通过任何方法知道,内容所运行的硬件规格。其次,除了用户的操作系统和浏览器外,并不知道其它信息。最后,终端用户可能像运行其它网页一样运行WebGL内容。因此这是一个非常复杂的问题。
减少Unity堆的大小
尽可能保持“WebGL Memory Size”足够小
减少代码量
启用Strip Engine Code
禁用异常检测
避免使用第三方插件
减少数据大小
使用Asset Bundles
使用Crunch纹理压缩
以空项目为例,内存分析器告诉我们总的使用量仅为16MB(这个值可能在不同Unity版本上有所不同):这意味着只须设置WebGL Memory Size大于16MB即可。当然,内存的总使用量将会依据内容而有所不同。
然而,如果因为某些原因无法使用分析器,可以简单地通过不断地减少WebGL Memory Size 值,直到发现您的内容真正所需要的最小内存使用量为止。
另外非常值得注意的是,任何不是16的倍数的值都将被自动四舍五入(在运行时)为下一个16的倍数,这是Emscripten编译器所要求的。
WebGL Memory Size(MB)设置将决定生成的html中TOTAL_MEMORY(bytes)的值。
最后,记住Unity分析器将占用一些来自Unity堆的内存,所以在使用分析器时可能需要增加WebGL内存大小。
除了消息内容,还可以尝试减少代码和数据的大小。这是因为当浏览器加载网页时,它将试图为一些内容寻找空余的内存,其中最重要的是:代码,数据,Unity堆和被编译的asm.js。它们可能相当大,尤其是数据和Unity堆内存,这对32位浏览器来说可能是问题。
在一些例子中,尽管存在足够多的空余内存,浏览器仍将加载失败,因为内存是碎片化的。这就是为什么有时候您的内容可能在重启浏览器之后,可以成功加载的原因。
另一种情况是,当Unity 内存溢出时提示以下信息:
使用Unity分析器测量Unity堆内存使用。但请注意,您可能需要增加WebGL的内存大小,以便能够使用分析器。
此外,我们一直在致力于开发一个新的工具,以便分析发布版本:使用时先构建WebGL版本,访问http://files.unity3d.com/build-report/即可使用该工具。虽然该工具在Unity5.4中可用,但请注意,这还是正在开发中的功能,并且随时会更改或被删除。至少现在可以使用它达到测试的目的。
是否可能出于开发目的而需要分配超过2032MB的内存?这是一个技术上的限制:2048MB(或更多)将会超出TypeArray所用的32位有符号整型的最大值,而TypeArray被用于在JavaScript中实现Unity堆。
希望这些信息对您有用。如有任何疑问,请点击[阅读原文]访问Unity官方中文社区留言评论。
更多Unity相关的技术文章: